Unlock biglock on hypercall preemption.
for ( i = 0; i < count; i++ )
{
- hypercall_may_preempt(
+ locked_hypercall_may_preempt(d,
__HYPERVISOR_mmu_update, 3, ureqs, count-i, success_count);
if ( unlikely(__copy_from_user(&req, ureqs, sizeof(req)) != 0) )
for ( ; ; )
{
- hypercall_may_preempt(__HYPERVISOR_set_trap_table, 1, traps);
+ locked_hypercall_may_preempt(current->domain,
+ __HYPERVISOR_set_trap_table, 1, traps);
if ( copy_from_user(&cur, traps, sizeof(cur)) ) return -EFAULT;
hypercall_create_continuation(_op , _nr_args , ##_args); \
return _op; \
} } while ( 0 )
+#define locked_hypercall_may_preempt(_d, _op, _nr_args, _args...) \
+ do { \
+ if ( unlikely(softirq_pending(smp_processor_id())) ) { \
+ hypercall_create_continuation(_op , _nr_args , ##_args); \
+ UNLOCK_BIGLOCK(_d); \
+ return _op; \
+ } } while ( 0 )
/* This domain_hash and domain_list are protected by the domlist_lock. */
#define DOMAIN_HASH_SIZE 256